package gm.server.virtual.simulator2D;

import com.sun.scenario.scenegraph.SGGroup;
import com.sun.scenario.scenegraph.SGShape;
import com.sun.scenario.scenegraph.SGTransform;
import gm.server.Arm;
import gm.server.Nut;
import java.awt.Color;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

/**
 * Kar komponens.
 *
 * @author imruf84
 */
public class ArmComponent extends Arm {

    /**
     * Síkidom transzformáció mátrixa.
     */
    final SGTransform.Affine transform = SGTransform.createAffine(null, null);
    /**
     * Csukló síkidomja.
     */
    final SGShape shape = new SGShape();
    /**
     * Transzformáció csoport.
     */
    final SGGroup transformGroup = new SGGroup();
    /**
     * Komponens.
     */
    final SGGroup component = new SGGroup();
    /**
     * Forgatás szöge fokokban.
     */
    private double angle = 0;

    /**
     * Konstruktor.
     *
     * @param length hossz
     * @param diameter átmérő
     * @param nut csavar
     */
    public ArmComponent(double length, double diameter, Nut nut) {
        super(length, diameter, nut);
        createComponent();
    }

    /**
     * Komponens létrehozása.
     */
    private void createComponent() {

        shape.setShape(new Rectangle2D.Double(-getDiameter() / 2d, 0, getDiameter(), getLength()));
        shape.setFillPaint(new Color(1f, 0, 1f, 1f));
        shape.setAntialiasingHint(RenderingHints.VALUE_ANTIALIAS_ON);

        transformGroup.add(shape);
        transform.setChild(transformGroup);
        component.add(transform);

        getNutComponent().appendChild(getComponent());

        updateTransform();
    }

    /**
     * Transzformáció frissítése.
     */
    private void updateTransform() {
        AffineTransform t = new AffineTransform();
        t.setToIdentity();
        t.rotate(getRotation());
        transform.setAffine(t);
    }

    /**
     * Beszúrás gyermekként.
     *
     * @param child gyermek
     */
    public void appendChild(SGGroup child) {
        transformGroup.add(child);
    }

    /**
     * Komponens lekérdezése.
     *
     * @return komponens
     */
    public SGGroup getComponent() {
        return component;
    }

    /**
     * Csavar komponens lekérdezése.
     *
     * @return csavar komponens
     */
    public NutComponent getNutComponent() {
        return (NutComponent) getNut();
    }

    /**
     * Forgatás szögének a lekérdezése.
     *
     * @return forgatás szöge
     */
    public double getRotation() {
        return angle;
    }

    /**
     * Forgatás szögének a megadása.
     *
     * @param angle forgatás szöge
     */
    public void setRotation(double angle) {
        this.angle = angle;
        updateTransform();
    }

}
